// setter getter
var obj={
    a:2,
    get a(){
       return 2;
    }
};
Object.defineProperty(
    obj,
    "b",
    {
        get:function(){
            return this.a*2
        },
        enumerable:true
    }
)
console.log(obj.a);// 2
console.log(obj.b)// 4
/**
 * 不管是对象文字语法中的 get a() { .. }，还是 defineProperty(..) 中的显式定义，二者
都会在对象中创建一个不包含值的属性，对于这个属性的访问会自动调用一个隐藏函数，
它的返回值会被当作属性访问的返回值
 */
/**
 * 为了让属性更合理，还应当定义 setter，和你期望的一样，setter 会覆盖单个属性默认的
[[Put]]（也被称为赋值）操作。通常来说 getter 和 setter 是成对出现的（只定义一个的话
通常会产生意料之外的行为）：
 */
var myobj={
    get a(){
        return this._a_;
    },
    set a(val){
       this._a_=val*2;
    }
};
myobj.a=3;
console.log(myobj.a);//6
console.log(myobj.b);// undefined